#include<iostream>
#include"SmartPtr.hpp"

using namespace std;

void testsmartptr1()
{
    bit::auto_ptr<int> sp1(new int);
    *sp1=1;
    
    bit::auto_ptr<pair<string, int>> sp2(new pair<string, int>("xxx",1));
    sp2->first+="bch";
    sp2->second+=100;
}

void testsmartptr2()
{
    bit::auto_ptr<int> sp1(new int);
    bit::auto_ptr<int>  sp2=sp1;//这里会报错，因为这里是浅拷贝，会析构资源两次
    //这里深拷贝也不可以，因为智能指针是想要管理资源
}

void test_auto_ptr1()
{
    //管理权转移
    bit::auto_ptr<int> sp1(new int);
    bit::auto_ptr<int>  sp2=sp1;
}
void test_shared_ptr1()
{
    bit::shared_ptr<string> sp1(new string("xxxxxxx"));
    bit::shared_ptr<string> sp2(sp1);
    bit::shared_ptr<string> sp3;
    
    sp3=sp1;
    
}

struct ListNode
{
    int val;
    bit::weak_ptr<ListNode> next;
    bit::weak_ptr<ListNode> prev;

    ~ListNode()
    {
        cout << "~ListNode()" << endl;
    }
};

void test_shared_ptr2()
{
    bit::shared_ptr<ListNode> n1(new ListNode);
    bit::shared_ptr<ListNode> n2(new ListNode);
    cout << n1.use_count() << endl;
    cout << n2.use_count() << endl;

    // 循环引用
    n1->next = n2;
    n2->prev = n1;

    cout << n1.use_count() << endl;
    cout << n2.use_count() << endl;
}
int main()
{
    //testsmartptr1();
    //test_auto_ptr1();
    //test_shared_ptr1();
    test_shared_ptr2();
    
    return 0;
}
